//
//  HomeViewController.swift
//  新浪微博
//
//  Created by MBP on 16/5/11.
//  Copyright © 2016年 MBP. All rights reserved.
//

import UIKit
import YYModel
import AFNetworking

//微博 cell ID
private let PNStatusCellID = "PNStatusCellID"
//微博 提示网络状态 cell ID
private let PNStatusTipCellID = "PNStatusTipCellID"

class HomeViewController: RootViewController {


    override func viewDidLoad() {
        //创建刷新控件
        setupRefreshControl()
        
        //调用父类
        super.viewDidLoad()
        
        //准备表格视图
        prepareTableView()
        
        //设置访客视图
        visitorView?.setupInfo(message: "关注一些人，回这里看看有什么惊喜")
        
        // 注册网络连接监听
        NSNotificationCenter.defaultCenter().addObserver(
            self,
            selector: #selector(HomeViewController.reachabilityChanged),
            name: AFNetworkingReachabilityDidChangeNotification,
            object: nil)
    }
    
    /// 准备表格视图
    private func prepareTableView() {
        // 注册可重用 cell
        tableView?.registerClass(StatusCell.self, forCellReuseIdentifier: PNStatusCellID)
        tableView?.registerClass(StatusTipCell.self, forCellReuseIdentifier: PNStatusTipCellID)
        
        // 设置行高属性 `尽量准确`
        // 设置预估行高的用处：
        // 1. 用数据源行数 * estimatedRowHeiht => contentSize，保证表格能够滚动
        tableView?.estimatedRowHeight = 200
        // 2. 设置行高是自动计算，调用数据源方法的时候，会根据 cell 的布局内容计算行高，动态更改 contentSize 的 height
        tableView?.rowHeight = UITableViewAutomaticDimension
    }
    //视图销毁时, 移除通知
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(
            self,
            name: AFNetworkingReachabilityDidChangeNotification,
            object: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        //判断当前window是否为niu (视图是否正在展示)
        if self.view.window == nil {
            //清空数组
            statusList.removeAll()
            //刷新数据
            loadData()
        }
    }
    /// 网路连接状态监听方法
    @objc private func reachabilityChanged() {
        // 刷新表格的第一个分组
        self.tableView?.reloadSections(NSIndexSet(index: 0), withRowAnimation: .Automatic)
    }
    //声明存放cell数据的数组
    private lazy var statusList = [StatusViewModel]()
    
    //加载数据
    override func loadData() {
        
        //声明布尔值的判断刷新状态的值
        let isPullup = refreshControl?.isPullupRefresh ?? false
        
        // 显示刷新控件
        refreshControl?.beginRefreshing()
        
        // 下拉刷新索引 - 取数组第一项 id
        let since_id = isPullup ? 0 : (statusList.first?.status.id ?? 0)
        // 上拉刷新索引 - 去数组最后一项 id
        let max_id = !isPullup ? 0 : (statusList.last?.status.id ?? 0)
        
        // 加载微博数据
        PNNetworkTool.sharedTools.loadStatus(since_id: since_id, max_id: max_id) { (result) -> () in
            
            // 结束刷新
            self.refreshControl?.endRefreshing()
            
            // [String: AnyObject] => [[String: AnyObject]]
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("您的网路不给力")
                return
            }
            
            // 遍历数组，字典转模型
            var arrayM = [StatusViewModel]()
            for dict in array {
                arrayM.append(StatusViewModel(status: Status.yy_modelWithJSON(dict)!))
            }
            
//            print(array)
            print("本次刷新数据条数 \(arrayM.count)")
            
            // 如果是上拉刷新，将刷新的数组放在后面
            if max_id > 0 {
                self.statusList += arrayM
            } else {
                self.statusList = arrayM + self.statusList
            }
            
            // 刷新数据
            self.tableView?.reloadData()
        }

    }
    
    
}

//父类Root 已经遵守协议, 此处不能重复遵守
extension HomeViewController {
    //返回组数
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }
    //返回行数
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        // 第 0 组返回提示 0 个cell，如果没有网络, 需要提示，才返回 1
        if section == 0 {
            return PNNetworkTool.sharedTools.reachable ? 0 : 1
        }
        
        // 第 1 组返回正常的微博 cell
        return statusList.count

    }
    
    //返回cell
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 分组 0 对应的是提示 cell
        if indexPath.section == 0 {
            return tableView.dequeueReusableCellWithIdentifier(PNStatusTipCellID, forIndexPath: indexPath)
        }
        
        // 分组 1，对应正常的微博 Cell
        let cell = tableView.dequeueReusableCellWithIdentifier(PNStatusCellID, forIndexPath: indexPath) as! StatusCell
        
        cell.viewModel = statusList[indexPath.row]
        return cell
   
    }
    
}